//如何开启服务器，以及如何获取用户请求数据，并响应数据
// 1.引入express包，和拥有获取post请求数据api的第三方包body-parser
var express = require('express')
var bodyParser = require('body-parser')
//引入文件操作模块
var fs = require('fs')
var formidable=require('formidable')

//引入路径操作模块
var path=require('path')
const { json } = require('body-parser')
// 2.创建你的服务器,也就是原来的http.createServer

var app = express()//这一步相当于原来的http.createServer创建一个服务器对象

// 配置使用express-art-template模板引擎,第一个参数表示当渲染以.html结尾的文件的时候使用express-art-template模板加载
app.engine('art', require('express-art-template'))
//虽然不需要配置art-template模板但是还是要安装，因为expres-art-template依赖了art-template
//express默认为response响应对象提供了render方法，但是只有配置了express-art-templat模板引擎之后才能使用

// 配置body-parser包
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))


//解决跨域需要安装cors包
const cors = require('cors');

app.use(cors({

    origin: ['http://127.0.0.1:8848'],
    credentials: true
}))


//用户头像存储路径
let faceimgpath="";

//开放静态资源目录
app.use('/faceimg/',express.static('./faceimg/'))
app.use('/img/',express.static('./img/'))

//根据用户账号查询该用户数据
app.get('/SearchUserInfo',function (req,res) {
    const SearchUserInfo=require('./user').SearchUserInfo
    SearchUserInfo(req.query.userAccount,function (info) {
        res.send(info)
    })
})


//注册用户数据接口，这一步当浏览器通过get请求访问/registerUser地址的时候服务器执行这个回调函数
app.post('/registerUser', function (req, res) {
    // res.send('hello express')
    const registerUser = require('./user').registerUser

    registerUser({
        username: req.body.username,
        password: req.body.password,
    }, (info) => {
        res.send(info)
    })
})

//登录用户数据接口，这一步当浏览器通过get请求访问/searchUser地址的时候服务器执行这个回调函数
app.post('/searchUser', function (req, res) {
    // res.send('hello express')
    const searchUser = require('./user').searchUser

    searchUser({account:req.body.account,password:req.body.password}, (info) => {
        res.send(info)
    })
})

//模糊查询用户名接口
app.get('/searchProbablyUser', function (req, res) {
    // res.send('hello express')
    const ProbablyUserName=require('./user').ProbablyUserName
    ProbablyUserName(req.query.username,function (info) {
        res.send(info)
    })

})

//用户头像图片数据上传接口，这一步当浏览器通过get请求访问/faceimgUser地址的时候服务器执行这个回调函数
app.post('/faceimgUser', function (req,res) {
    var form = new formidable.IncomingForm()
    form.encoding = 'utf-8' // 编码
    form.keepExtensions = true // 保留扩展名
    form.uploadDir = path.join(__dirname, './faceimg/')//将文件保存在指定目录
    form.parse(req, (err, fields, files) => {
        faceimgpath=`http://localhost:3030/faceimg/${files.file.name}`;
        console.log('files', files) //上传文件用files.<name>访问
        if (err) return next(err)
        console.log('files', files) //上传文件用files.<name>访问
        fs.writeFileSync(`./faceimg/${files.file.name}`, fs.readFileSync(files.file.path));
    })
    res.send("500")
})

//用户编辑数据接口
app.post('/editUser',function (req,res) {
        const editUser=require('./user').editUser
        editUser(
            {faceimgpath:faceimgpath,account:req.body.account,username:req.body.username,password:req.body.password,contents:req.body.contents},
            function (info) {
                    faceimgpath="";
                    res.send(info)
            }
        )
})


//发布经验数据接口
//经验内容保存
app.get('/release',function (req,res) {
    const releaseExp=require("./experience").releaseExp
    releaseExp({
        originalTitle:req.query.originalTitle,
        originalContent:req.query.originalContent,
        content:req.query.content,
        title:req.query.title,
        userAccount:req.query.userAccount,
    },function (info) {
        res.send(info)
    })

})
//经验富文本图片插入
app.post('/releaseimg', function (req,res) {
    let releaseimgpath="";
    let releaseimgname="";
    var form = new formidable.IncomingForm()
    form.encoding = 'utf-8' // 编码
    form.keepExtensions = true // 保留扩展名
    form.uploadDir = path.join(__dirname, './img/')
    form.parse(req, (err, fields, files) => {
        releaseimgpath=`http://localhost:3030/img/${files.file.name}`;
        releaseimgname=files.file.name;
        console.log('files', files) //上传文件用files.<name>访问
        if (err) return next(err)
        console.log('files', files) //上传文件用files.<name>访问
        fs.writeFileSync(`./img/${files.file.name}`, fs.readFileSync(files.file.path));
        let info={
            code: 0 //0表示成功，其它失败
            ,msg: "" //提示信息 //一般上传失败后返回
            ,data: {
                src: releaseimgpath
                ,title: releaseimgname //可选
            }
        }
        res.send(info)
    })
})


//前十条热门经验接口
app.get('/hotsearch',function (req,res) {
    const hotsearch=require('./experience').hotsearch
    hotsearch(function (info) {
        res.send(info)
    })
})

//根据关键字模糊查询经验内容接口
app.get('/probablyexp',function (req,res) {
    const  ProbablyExp=require('./experience').ProbablyExp
    ProbablyExp(req.query.searchinfo,function (info) {
        res.send(info)
    })
})

//当前经验详情接口
app.get('/currentExperience',function (req,res) {
    const currentExperience=require('./experience').currentExperience
    currentExperience(req.query.expId,function (info) {
        res.send(info)
    })
})

//根据用户id查询该用户发布的所有经验信息
app.get('/currentUserExperience',function (req,res) {
    const currentUserExperience=require('./experience').currentUserExperience
    currentUserExperience(req.query.userAccount,function (info) {
        res.send(info)
    })
})

//发布文章评论追加
app.get('/releaseComment',function (req,res) {
    const releaseComment=require("./comment").releaseComment
    releaseComment({
        userAccount:req.query.userAccount,
        expId:req.query.expId,
        userName:req.query.userName,
        content:req.query.content,
    },function (info) {
        res.send(info)
    })
})

//查找对应文章id的所有评论
app.get('/findComment',function (req,res) {
    const  findComment=require('./comment').findComment
    findComment(req.query.expId,function (info) {
        res.send(info)
    })


})

//根据评论id删除对应评论
app.get('/deleteComment',function (req,res) {
    const deleteComment=require('./comment').deleteComment
    deleteComment(req.query.commentId,function (info) {
            res.send(info)
    })
})

//根据用户id查找用户所有评论
app.get('/findUserComment',function (req,res) {
    const findUserComment=require('./comment').findUserComment
    findUserComment(req.query.userAccount,function (info) {
        res.send(info)
    })
})

//收藏经验
app.get('/colExp',function (req,res) {
    const colExp=require('./user').colExp
    colExp({
        userAccount:req.query.userAccount,
        expId:req.query.expId,
        title:req.query.expTitle,
        content:{details:req.query.expContent}
    },(info)=>{
            res.send(info)
            console.log(info)
    })
})

//取消收藏经验
app.get('/cancelcolExp',function (req,res) {
    const  cancelcolExp =require('./user').cancelcolExp
    cancelcolExp({userAccount:req.query.userAccount,expId:req.query.expId},(info)=>{
        res.send(info)
    })
})


// 文件存储,获取前端传过来的文件数据并保存在指定位置
// app.post('/addimge', function (req,res) {
//     var form = new formidable.IncomingForm()
//     form.encoding = 'utf-8' // 编码
//     form.keepExtensions = true // 保留扩展名
//     form.uploadDir = path.join(__dirname, './faceimg/')
//     form.parse(req, (err, fields, files) => {
//         console.log('files', files) //上传文件用files.<name>访问
//         if (err) return next(err)
//         console.log('files', files) //上传文件用files.<name>访问
//         fs.writeFileSync(`./faceimg/${files.file.name}`, fs.readFileSync(files.file.path));
//     })
//
// })



// 当浏览器访问3030端口的地址，服务器可以监听到并且在控制台打印这条消息
app.listen(3030, function () {

    console.log('app is running at port 3030')
})